package cn.chinaunicom.sdsi.frm.workflow.task.service;

import java.util.List;
import java.util.Map;

import cn.chinaunicom.sdsi.frm.workflow.bean.HistoicFlowVO;
import cn.chinaunicom.sdsi.frm.workflow.bean.TaskVO;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

/**
 * 任务相关服务层接口
 * 
 * @author liyh
 */
public interface ActTaskService {

	/**
	 * 查询符合分页条件的结果集
	 * 
	 * @param vo
	 *            查询条件封装
	 * @param firstResult
	 *            开始记录index
	 * @param maxResults
	 *            每页显示条数
	 * @return 返回的json对象
	 */
	JSONObject listToDo4Page(TaskVO vo, int firstResult, int maxResults);

	/**
	 * 查询符合分页条件的结果集
	 * 
	 * @param vo
	 *            任务对象
	 * @param firstResult
	 *            开始记录
	 * @param maxResults
	 *            每页条数
	 * @return 已办查询封装结果
	 */
	JSONObject listHasDone4Page(TaskVO vo, int firstResult, int maxResults);

	/**
	 * 简退-回退操作
	 * 
	 * @param processInstanceId
	 *            流程实例ID
	 * @param taskId
	 *            当前任务ID
	 * @param comment
	 *            流程意见
	 * @return 是否成功
	 */
	boolean backForQuick(String processInstanceId, String taskId, String comment);

	/**
	 * 简退-推进操作
	 * 
	 * @param processInstanceId
	 *            流程实例ID
	 * @param currentTaskId
	 *            当前进行简退推进操作的任务ID
	 * @param comment
	 *            推进意见
	 * @return 是否推进成功
	 */
	boolean pushForQuick(String processInstanceId, String currentTaskId, String comment);

	/**
	 * 转派功能，当前任务更换处理人，记录流转历史
	 * 
	 * @param taskId
	 *            当前任务ID
	 * @param processInstanceId
	 *            流程实例ID
	 * @param assignee
	 *            预指定处理人
	 * @param comment
	 *            审批意见
	 * @return 新任务ID
	 */
	String transferTask(String taskId, String processInstanceId, String assignee, String comment);

	/**
	 * 根据待办、已办列表的参数获取主业务页面的URL
	 * 
	 * @param processInstanceId
	 *            流程实例ID
	 * @param taskId
	 *            任务ID
	 * @param taskDefinitionKey
	 *            流程定义key
	 * @param todo
	 *            是否待办，否则已办
	 * @return 待办业务处理路径相关信息
	 */
	JSONObject findTaskUrlAndHandleParam(String processInstanceId, String taskId, String taskDefinitionKey,
			boolean todo);

	/**
	 * 据流程实例ID获取流转历史
	 * 
	 * @param procInsId
	 *            流程实例ID
	 * @return 时间顺序流程全部流转记录集合
	 */
	List<HistoicFlowVO> findHistoicFlowList(String procInsId);

	/**
	 * 获取流程图byte数组
	 * 
	 * @param processInstanceId
	 *            流程实例ID
	 * @return 图像byte数组
	 * @throws Exception
	 */
	byte[] getDiagram(String processInstanceId) throws Exception;

	/**
	 * 根据流程定义及任务定义与审批状况查找可选环节
	 * 
	 * @param processDefinitionKey
	 *            流程定义Key
	 * @param pathSelect
	 *            分支环节选取环节
	 * @return 包含可选路径的组合对象
	 */
	JSONArray findLinkIds(String processDefinitionKey, int pathSelect);

	/**
	 * 用户审批点击通过或回退时加载可选环节
	 * 
	 * @param taskId
	 *            当前任务ID
	 * @param handleType
	 *            处理类型（1、通过2、退回）
	 * @param passSelect
	 *            分支环节选取环节
	 * @return 可选环节键值对
	 */
	JSONArray findLinkIds(String taskId, int handleType, int pathSelect);

	/**
	 * 获取办理信息tab页集合
	 * 
	 * @param processDefinitionKey
	 *            流程定义KEY
	 * @param taskDefinitionKey
	 *            任务定义KEY
	 * @param todo
	 *            是否为待办
	 * @return 返回集合数据信息
	 */
	JSONArray parseTabUrls(String processDefinitionKey, String taskDefinitionKey, boolean todo);

	/**
	 * 获取任务详细页面环节出行及按钮显隐配置
	 * 
	 * @param processDefinitionKey
	 *            流程定义Key
	 * @param taskDefinitionKey
	 *            任务定义Key
	 * @return 按钮显隐信息
	 */
	Map<String, Boolean> getLinkCfg(String processDefinitionKey, String taskDefinitionKey);

	/**
	 * 浏览待办后，为上环节处理人不可撤回打标
	 * 
	 * @param processInstanceId
	 *            实例ID
	 * @param taskId
	 *            任务ID
	 * @return 更新记录数，正常为1
	 */
	int viewTask(String processInstanceId, String taskId);

	/**
	 * 判断当前已办环节是否可以撤回
	 * 
	 * @param processInstanceId
	 *            实例
	 * @param taskId
	 *            任务
	 * @return 是否可回撤
	 */
	boolean isCanWithDraw(String processInstanceId, String taskId);

	/**
	 * 是否为简退后的提交首环节
	 * 
	 * @param processInstanceId
	 *            流程实例ID
	 * @param taskId
	 *            任务ID
	 * @return 是否可直接提交至退回环节的退回人
	 */
	boolean isBackForQuick(String processInstanceId, String taskId);

	/**
	 * 查看任务是否已经完成
	 * 
	 * @param taskId
	 *            任务ID
	 * @return 是否已经完成
	 */
	boolean isFinishedTask(String taskId);
}
